IPCA¶
A taxa de inflação é amplamente reconhecida como a medida que reflete o aumento geral dos preços entre dois momentos distintos no tempo. No contexto brasileiro, o Índice de Preços ao Consumidor Amplo (IPCA) se estabeleceu como a principal referência para monitorar e controlar a inflação, sendo divulgado pelo Instituto Brasileiro de Geografia e Estatística (IBGE) e adotado de forma abrangente pelas autoridades monetárias.
Para obter uma análise abrangente, procederemos com a importação dos dados do IPCA e a subsequente visualização desses dados. O IPCA é atualizado mensalmente pelo IBGE, o que nos permite acessar os dados diretamente por meio do Sistema IBGE de Recuperação Automática (SIDRA) com a utilização da biblioteca {sidrapy}.
Em primeiro lugar, iremos localizar a série de dados que abrange a variação mensal, a variação acumulada em 3 meses, em 6 meses, em 12 meses e o acumulado no ano. Estas informações estão disponíveis na tabela 1737 do SIDRA.
Em uma segunda etapa, vamos extrair a série de pesos e variações de cada grupo que compõe o IPCA. Isso nos permitirá entender a contribuição de cada grupo para a taxa geral de inflação. Esses dados podem ser obtidos a partir da tabela 7060.
Para importar essas séries de dados usando a função get_table do {sidrapy}, iremos acessar a API das tabelas, configurando os parâmetros necessários para obter os códigos de identificação das séries. O processo de coleta de dados do SIDRA com Python foi detalhado em um post anterior intitulado "Coletando dados do SIDRA com o Python".
# Importa as bibliotecas necessárias
#!pip install sidrapy
import sidrapy
import numpy as np
import pandas as pd
import datetime as dt
import seaborn as sns
from matplotlib import pyplot as plt
Collecting sidrapy Downloading sidrapy-0.1.4-py3-none-any.whl (6.9 kB) Requirement already satisfied: requests in c:\users\user\anaconda3\lib\site-packages (from sidrapy) (2.31.0) Requirement already satisfied: pandas in c:\users\user\anaconda3\lib\site-packages (from sidrapy) (2.0.3) Requirement already satisfied: python-dateutil>=2.8.2 in c:\users\user\anaconda3\lib\site-packages (from pandas->sidrapy) (2.8.2) Requirement already satisfied: pytz>=2020.1 in c:\users\user\anaconda3\lib\site-packages (from pandas->sidrapy) (2023.3.post1) Requirement already satisfied: tzdata>=2022.1 in c:\users\user\anaconda3\lib\site-packages (from pandas->sidrapy) (2023.3) Requirement already satisfied: numpy>=1.21.0 in c:\users\user\anaconda3\lib\site-packages (from pandas->sidrapy) (1.24.3) Requirement already satisfied: charset-normalizer<4,>=2 in c:\users\user\anaconda3\lib\site-packages (from requests->sidrapy) (2.0.4) Requirement already satisfied: idna<4,>=2.5 in c:\users\user\anaconda3\lib\site-packages (from requests->sidrapy) (3.4) Requirement already satisfied: urllib3<3,>=1.21.1 in c:\users\user\anaconda3\lib\site-packages (from requests->sidrapy) (1.26.16) Requirement already satisfied: certifi>=2017.4.17 in c:\users\user\anaconda3\lib\site-packages (from requests->sidrapy) (2023.7.22) Requirement already satisfied: six>=1.5 in c:\users\user\anaconda3\lib\site-packages (from python-dateutil>=2.8.2->pandas->sidrapy) (1.16.0) Installing collected packages: sidrapy Successfully installed sidrapy-0.1.4
Variações do IPCA: tabela 1737¶
# Importa as variações do IPCA
ipca_raw = sidrapy.get_table(table_code = '1737',
territorial_level = '1',
ibge_territorial_code = 'all',
variable = '63,69,2263,2264,2265',
period = 'last%20472')
# Realiza a limpeza e manipulação da tabela
ipca = (
ipca_raw
.loc[1:,['V', 'D2C', 'D3N']]
.rename(columns = {'V': 'value',
'D2C': 'date',
'D3N': 'variable'}
)
.assign(variable = lambda x: x['variable'].replace({'IPCA - Variação mensal' : 'Var. mensal (%)',
'IPCA - Variação acumulada no ano': 'Var. acumulada no ano (%)',
'IPCA - Variação acumulada em 3 meses' : 'Var. MM3M (%)',
'IPCA - Variação acumulada em 6 meses': 'Var. MM6M (%)',
'IPCA - Variação acumulada em 12 meses' : 'Var. MM12M (%)'}),
date = lambda x: pd.to_datetime(x['date'],
format = "%Y%m"),
value = lambda x: x['value'].astype(float)
)
.pipe(lambda x: x.loc[x.date > '2007-01-01']
)
)
ipca
| value | date | variable | |
|---|---|---|---|
| 1361 | 0.44 | 2007-02-01 | Var. mensal (%) |
| 1362 | 0.88 | 2007-02-01 | Var. acumulada no ano (%) |
| 1363 | 1.37 | 2007-02-01 | Var. MM3M (%) |
| 1364 | 2.23 | 2007-02-01 | Var. MM6M (%) |
| 1365 | 3.02 | 2007-02-01 | Var. MM12M (%) |
| ... | ... | ... | ... |
| 2356 | 0.26 | 2023-09-01 | Var. mensal (%) |
| 2357 | 3.50 | 2023-09-01 | Var. acumulada no ano (%) |
| 2358 | 0.61 | 2023-09-01 | Var. MM3M (%) |
| 2359 | 1.38 | 2023-09-01 | Var. MM6M (%) |
| 2360 | 5.19 | 2023-09-01 | Var. MM12M (%) |
1000 rows × 3 columns
# Configura o tema do gráfico
## Cores
colors = ['#282f6b', '#b22200', '#eace3f', '#224f20', '#b35c1e', '#419391', '#839c56','#3b89bc']
## Tamanho
theme = {'figure.figsize' : (15, 10)}
## Aplica o tema
sns.set_theme(rc = theme,
palette = colors)
# Filtra somente para o IPCA acumulado em 12 meses
ipca_12m = (
ipca
.pipe(lambda x: x.loc[x.variable == 'Var. MM12M (%)'])
)
# Plota o IPCA acumulado em 12 meses
sns.lineplot(x = 'date',
y = 'value',
data = ipca_12m).set(title = 'IPCA acumulado em 12 meses',
xlabel = '',
ylabel = '% a.a.')
# Adiciona a fonte no gráfico
plt.annotate('Fonte: analisemacro.com.br com dados do Sidra/IBGE',
xy = (1.0, -0.08),
xycoords='axes fraction',
ha='right',
va="center",
fontsize=10)
Text(1.0, -0.08, 'Fonte: analisemacro.com.br com dados do Sidra/IBGE')
# Plota todas as variações
g = sns.FacetGrid(ipca, col = 'variable',
col_wrap = 2,
hue = 'variable',
sharey = False,
height = 4,
aspect = 2)
g.map_dataframe(sns.lineplot,
x = 'date',
y = 'value').set(xlabel = "",
ylabel = '%')
# Adiciona a fonte no gráfico
plt.annotate('Fonte: analisemacro.com.br com dados do Sidra/IBGE',
xy = (1.0, -0.13),
xycoords='axes fraction',
ha='right',
va="center",
fontsize=10)
C:\Users\User\anaconda3\Lib\site-packages\seaborn\axisgrid.py:118: UserWarning: The figure layout has changed to tight self._figure.tight_layout(*args, **kwargs)
Text(1.0, -0.13, 'Fonte: analisemacro.com.br com dados do Sidra/IBGE')
IPCA Contribuição por grupo: tabela 7060¶
# Importa as variações e os pesos dos grupos do IPCA
ipca_gp_raw = sidrapy.get_table(table_code = '7060',
territorial_level = '1',
ibge_territorial_code = 'all',
variable = '63,66',
period = 'all',
classification = '315/7170,7445,7486,7558,7625,7660,7712,7766,7786'
)
# Realiza a limpeza e manipulação da tabela
ipca_gp = (
ipca_gp_raw
.loc[1:,['V', 'D2C', 'D3N', 'D4N']]
.rename(columns = {'V': 'value',
'D2C': 'date',
'D3N': 'variable',
'D4N': 'groups'})
.assign(variable = lambda x: x['variable'].replace({'IPCA - Variação mensal' : 'variacao',
'IPCA - Peso mensal': 'peso'}),
date = lambda x: pd.to_datetime(x['date'],
format = "%Y%m"),
value = lambda x: x['value'].astype(float),
groups = lambda x: x['groups'].astype(str)
)
.pipe(lambda x: x.loc[x.date > '2007-01-01'])
)
# Torna em formato wide e calcula a contribuição de cada grupo pro IPCA
ipca_gp_wider = (
ipca_gp
.pivot_table(index = ['date', 'groups'],
columns = 'variable',
values = 'value')
.reset_index()
.assign(contribuicao = lambda x: (x.peso * x.variacao) / 100)
)
# Importa a biblioteca plotly
#!pip install plotly
import plotly.express as px
# Plota a contribuição de cada grupo com plotly
px.bar(ipca_gp_wider,
x = 'date',
y = 'contribuicao',
color = 'groups',
color_discrete_sequence = colors)